package com.tao.design.order

/**
 *
 * @ProjectName:    lab
 * @Package:        com.tao.design.order
 * @ClassName:      order
 * @Description:     java类作用描述
 * @Author:         wangxf
 * @CreateDate:     2022/4/25 11:32
 * @UpdateUser:     更新者
 * @UpdateDate:     2022/4/25 11:32
 * @UpdateRemark:   更新说明
 * @Version:        1.0
 */


/**
 *
 * eg:遥控器控制给不同的 电器下命令
 *
 *
 * 概念： 顾客  命令对象
 *
 * 通过将命令包装成一位数据对象来 是的 命令请求者 从 命令执行者中 解耦出来
 *
 * 定义 将请求封装为对象，以便使用不同的请求 队列或日志来初始换其他对象 命令模式也包含可撤销的操作
 *
 * 优势：可实现命令的组合 实现复杂功能
 *
 *
 * 由于触发执行命令 是统一的接口 所以在 可用在 网络请求队列中  队列中有多个命令 依次执行
 *
 *
 * 命令模式
 *
 */
abstract class Receiver {
    abstract fun action()
}

interface Command {
    /**
     *
     */
    fun execute()
    fun undo();
}

class ConcreteCommand(val light: Light) : Command {
    override fun execute() {
        light.on();
    }

    override fun undo() {
    }
}

class NoCommand : Command {
    override fun execute() {
    }

    override fun undo() {
    }
}

class Light {
    fun off() {}
    fun on() {}
}

class RemoteControl {
    val commands: Array<Command> = Array(11) { i -> NoCommand() };

    fun pushButtn() {
        commands[0].execute()
    }

}

fun main() {
    val light = Light();
    val command = ConcreteCommand(light);
    val control = RemoteControl();
    control.commands[0] = command;

    control.pushButtn();

}
